/**
 * @file CRhoFloydAlg.cpp Implementácia triedy CRhoFloydAlg.
 *
 * @author Martin Kosorinský.
 * @date 1.4.2009.
 */

#include "CRhoFloydAlg.hpp"

bool CRhoFloydAlg::computeLogarithm(big vysledok) {

    tracer << "Pollard-Rho (floyd):" << endl;
    if (!isInitialized()) {
        cerr << "Nie je inicializovaný kontext!" << endl;
        return false;
    }

    big a1 = mirvar(1);                     // koeficient a z dokumentacie k algoritmu od Pollarda
    big b1 = mirvar(0);                     // koeficient b z dokumentacie k algoritmu od Pollarda
    big tmp = mirvar(0);                    // pomocná instancia

    epoint* X1 = epoint_init();             // bod, s ktorym budeme skakat v zavislosti od zmeny koeficientov
    epoint_copy(G, X1);                     // vypocet cesty nahodnej cesty zacina od generatora

    big a2 = mirvar(1);                     // koeficient a z dokumentacie k algoritmu od Pollarda
    big b2 = mirvar(0);                     // koeficient b z dokumentacie k algoritmu od Pollarda
    epoint* X2 = epoint_init();             // bod, s ktorym budeme skakat v zavislosti od zmenu koeficientov
    epoint_copy(G, X2);                     // vypocet cesty nahodnej cesty zacina od generatora

    while (true) {                          // nekonecna sluska, konciaca len v pripade uspechu vypoctu
        makeStep(X1, a1, b1, tmp);          // vykonanie skoku bodu X1
        makeStep(X2, a2, b2, tmp);          // vykonanie dvoch skokov bodu X2
        makeStep(X2, a2, b2, tmp);

        if (epoint_comp(X1, X2)) {          // TRUE, ak sme nasli koliziu
            if (computeIndex(a1, b1, a2, b2, vysledok)) {
                break;                      // vypocet konci uspechom, skok na koniec, dealokacia ...
            }
        }
    }
    // sem sme sa mohli dostat, len ak bol vypocet indexu uspesny
    mirkill(a1);
    mirkill(a2);
    mirkill(b1);
    mirkill(b2);
    mirkill(tmp);
    epoint_free(X1);
    epoint_free(X2);
    return true;
}
